package com.example.springbooti18.service;

import com.example.springbooti18.entity.Message;
import com.example.springbooti18.repository.MessageRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.List;
import java.util.Optional;

/**
 * 国际化消息服务类
 * 提供消息的增删改查操作
 */
@Service
public class MessageService {

    @Autowired
    private MessageRepository messageRepository;

    /**
     * 根据消息键和语言代码获取消息
     * @param key 消息键
     * @param languageCode 语言代码
     * @return 消息对象
     */
    public Optional<Message> getMessage(String key, String languageCode) {
        return messageRepository.findByKeyAndLanguageCode(key, languageCode);
    }

    /**
     * 获取指定语言的所有消息
     * @param languageCode 语言代码
     * @return 消息列表
     */
    public List<Message> getMessagesByLanguageCode(String languageCode) {
        return messageRepository.findByLanguageCode(languageCode);
    }

    /**
     * 获取指定消息键的所有语言版本
     * @param key 消息键
     * @return 消息列表
     */
    public List<Message> getMessagesByKey(String key) {
        return messageRepository.findByKey(key);
    }

    /**
     * 保存消息
     * @param message 消息对象
     * @return 保存后的消息对象
     */
    @Transactional
    public Message saveMessage(Message message) {
        // 检查是否已存在相同的消息键和语言代码
        if (messageRepository.existsByKeyAndLanguageCode(message.getKey(), message.getLanguageCode())) {
            // 如果存在，先删除旧的
            messageRepository.deleteByKeyAndLanguageCode(message.getKey(), message.getLanguageCode());
        }
        return messageRepository.save(message);
    }

    /**
     * 批量保存消息
     * @param messages 消息列表
     * @return 保存后的消息列表
     */
    @Transactional
    public List<Message> saveMessages(List<Message> messages) {
        return messageRepository.saveAll(messages);
    }

    /**
     * 删除消息
     * @param id 消息ID
     */
    @Transactional
    public void deleteMessage(Long id) {
        messageRepository.deleteById(id);
    }

    /**
     * 根据消息键和语言代码删除消息
     * @param key 消息键
     * @param languageCode 语言代码
     */
    @Transactional
    public void deleteMessage(String key, String languageCode) {
        messageRepository.deleteByKeyAndLanguageCode(key, languageCode);
    }

    /**
     * 获取所有支持的语言代码
     * @return 语言代码列表
     */
    public List<String> getAllLanguageCodes() {
        return messageRepository.findAllLanguageCodes();
    }

    /**
     * 检查消息是否存在
     * @param key 消息键
     * @param languageCode 语言代码
     * @return 是否存在
     */
    public boolean existsMessage(String key, String languageCode) {
        return messageRepository.existsByKeyAndLanguageCode(key, languageCode);
    }

    /**
     * 获取所有消息
     * @return 消息列表
     */
    public List<Message> getAllMessages() {
        return messageRepository.findAll();
    }
}